import axios from "axios";
let axiosIns = axios.create({});

axiosIns.defaults.headers.post["X-Requested-With"] = "XMLHttpRequest";
axiosIns.defaults.headers.get["X-Requested-With"] = "XMLHttpRequest";
axiosIns.defaults.responseType = "json";
axiosIns.defaults.timeout = 15000;

// axiosIns.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
// axiosIns.defaults.headers.post['Content-Type'] = 'application/json';
//数据序列化
// axiosIns.defaults.transformRequest = [function (data) {
//   return qs.stringify(data);
// }];

axiosIns.defaults.validateStatus = function () {
  return true;
};

/**
 * 请求拦截
 */
axiosIns.interceptors.request.use(
  (config) => {
    //配置config
    config.headers.Accept = "*/*";

    if (config.ContentType === "form") {
      config.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
    }
    if (window.sessionStorage.getItem("token")) {
      let token = window.sessionStorage.getItem("token");

      let authorization = JSON.parse(token).authorization;

      config.headers.authorization = authorization;
    }
    config.headers.projectId = "ROBOT_v1";

    return config;
  },
  (error) => {
    return Promise.error(error);
  }
);
/**
 * 响应拦截
 */
axiosIns.interceptors.response.use(
  (response) => {
    let data = response.data;
    let status = response.status;
    if (status === 200 || status === 201 || status === 202) {
      return Promise.resolve(data);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是2开头的的情况
  // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
  (error) => {
    var msg;
    if (error.response.status) {
      switch (error.response.status) {
        case 400:
          msg = "错误请求！";
          break;
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 401:
          msg = "未登录,请登录1";
          // router.replace({
          //   path: '/login',
          //   query: {
          //     redirect: router.currentRoute.fullPath
          //   }
          // });
          break;
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          msg = "登录过期，请重新登录！";
          // 清除token
          // localStorage.removeItem('token');
          //store.commit('loginSuccess', null);
          // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
          // setTimeout(() => {
          //   router.replace({
          //     path: '/login',
          //     query: {
          //       redirect: router.currentRoute.fullPath
          //     }
          //   });
          // }, 1000);
          break;
        // 404请求不存在
        case 404:
          msg = "网络请求不存在！";
          break;
        // 其他错误，直接抛出错误提示
        default:
          // Message.warning({
          //   message: error.response.data.message,
          //   duration: 1500,
          // });
          console.log(msg);
      }
      // Message.error({
      //   message: msg
      // });

      return Promise.reject(error.response);
    } else {
      // Message.error({
      //   message: '连接服务器失败！'
      // });
    }
  }
);

let ajaxMethod = ["get", "post", "delete", "put"];
let http = {};

ajaxMethod.forEach((method) => {
  //数组取值的两种方式
  http[method] = function (uri, data, config) {
    return new Promise(function (resolve, reject) {
      axiosIns[method](uri, data, config)
        .then((response) => {
          // console.log(response)
          /*根据后台数据进行处理
           *1 code===200   正常数据+错误数据     code!==200   网络异常等
           *2 code===200   正常数据     code!==200   错误数据+网络异常等
           * 这里使用的是第一种方式
           */
          // console.log(response)
          if (response.status === 201 || response.status === 202)
            resolve(response);

          if (
            response.code === 11030110 ||
            response.code === 11030113 ||
            response.code === 11030111 ||
            response.code === 11030112
          ) {
            // Message.warning({
            //   content: 'token失效,需要重新登录!',
            //   duration: 3
            // })
          } else {
            resolve(response);
          }
        })
        .catch((response) => {
          reject(response);
        });
    });
  };
});

export default http;
